import type { FC, ReactElement } from 'react';
import { Navigate, useLocation } from 'react-router-dom';

interface AuthGuardProps {
  children: ReactElement;
  requiresAuth?: boolean;
  permissions?: string[];
}

// 模拟用户权限检查函数，实际项目中应从状态管理或接口获取
const checkUserPermission = (requiredPermissions?: string[]): boolean => {
  // 模拟用户权限，实际应用中可以从状态管理获取
  const userPermissions = ['admin', 'user'];

  if (!requiredPermissions || requiredPermissions.length === 0) {
    return true;
  }

  return requiredPermissions.some((permission) => userPermissions.includes(permission));
};

// 模拟用户登录状态检查
const isUserLoggedIn = (): boolean => {
  // 实际项目中通常会检查 localStorage、cookies 或状态管理中的登录状态
  return localStorage.getItem('token') !== null;
};

const AuthGuard: FC<AuthGuardProps> = ({ children, requiresAuth = false, permissions = [] }) => {
  const location = useLocation();

  // 如果不需要认证，直接渲染子组件
  if (!requiresAuth) {
    return children;
  }

  // 检查登录状态
  if (!isUserLoggedIn()) {
    // 重定向到登录页，并记录当前位置供登录后返回
    return <Navigate to="/login" state={{ from: location }} replace />;
  }

  // 检查权限
  if (!checkUserPermission(permissions)) {
    // 无权限访问，重定向到无权限页面
    return <Navigate to="/unauthorized" replace />;
  }

  // 通过所有检查，渲染子组件
  return children;
};

export default AuthGuard;
